package org.example.myleet.p1128;

import java.util.*;

public class Solution {
    /**
     * 18 ms
     */
    public int numEquivDominoPairs(int[][] dominoes) {
        HashMap<Dominoes, List<Dominoes>> dominoesMap = new HashMap<>();
        for (int[] d : dominoes) {
            Dominoes dominoes1 = new Dominoes(d[0], d[1]);
            dominoesMap.computeIfAbsent(dominoes1, key -> new ArrayList<>()).add(dominoes1);
        }
        int count = 0;
        for (List<Dominoes> value : dominoesMap.values()) {
            int len = value.size();
            //利用等差数列或组合数的原理获得一种骨牌的pair数目
            count += (len - 1) * len / 2;
        }
        return count;
    }

    /**
     * 骨牌对象，强行让两个值相同的情况下hashCode和equals是相同的，使得HashMap内被映射到同一位置上
     */
    static class Dominoes {
        int x;
        int y;

        public Dominoes(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Dominoes dominoes = (Dominoes) o;
            return (x == dominoes.x && y == dominoes.y) || (x == dominoes.y && y == dominoes.x);
        }

        @Override
        public int hashCode() {
            return Objects.hash(x, y) + Objects.hash(y, x);
        }
    }

    /**
     * 正解答案，将两个数按照小的*10，大的作为各位，存储在100长度的整数内代表一种骨牌，并直接累加对应的骨牌数目
     * 因为每发现一个新的相同骨牌，都可以与已经发现的相同骨牌每一块都组成一对
     */
//    public int numEquivDominoPairs(int[][] dominoes) {
//        int[] num = new int[100];
//        int ret = 0;
//        for (int[] domino : dominoes) {
//            int val = domino[0] < domino[1] ? domino[0] * 10 + domino[1] : domino[1] * 10 + domino[0];
//            ret += num[val];
//            num[val]++;
//        }
//        return ret;
//    }
}
